//package com.j.lemon.learn.basic.redis;
//
//import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Value;
//import redis.clients.jedis.HostAndPort;
//import redis.clients.jedis.Jedis;
//import redis.clients.jedis.JedisCluster;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.PreDestroy;
//import javax.annotation.Resource;
//import java.io.IOException;
//import java.util.Collections;
//import java.util.HashSet;
//import java.util.Set;
//
///**
// * @Author lijunjun
// * @Date 2018-12-24 10:05
// * @Description
// */
//public class JedisPool {
//    private static final String LOCK_SUCCESS = "OK";
//    private static final String SET_IF_NOT_EXIST = "NX";
//    private static final String SET_WITH_EXPIRE_TIME = "PX";
//    private static final Long RELEASE_SUCCESS = 1L;
//    private static final Integer EXPIRE_TIME=3000;
//    private static final String REQUEST_ID = "iapi";
//
//    private static final Logger logger = LoggerFactory.getLogger(JedisPool.class);
//
//    private JedisCluster jedisPool;
//
//    @Value("${redis_url}")
//    private String url;
//
//    @Value("${redis_password}")
//    private String password;
//
//
//    @PostConstruct
//    public void init() {
//        GenericObjectPoolConfig jedisPoolConfig = new GenericObjectPoolConfig();
//        jedisPoolConfig.setMaxTotal(1);
//        jedisPoolConfig.setMaxIdle(1);
//        jedisPoolConfig.setMaxWaitMillis(5000);
//
//        String[] addr = url.split(",");
//        Set<HostAndPort> hostAndPorts = new HashSet<>();
//        for (String url : addr) {
//            String[] split = url.split(":");
//            hostAndPorts.add(new HostAndPort(split[0], Integer.valueOf(split[1])));
//        }
//
//        this.jedisPool = new JedisCluster(hostAndPorts, jedisPoolConfig);
//
//    }
//
//    @PreDestroy
//    public void destroy() {
//        try {
//            jedisPool.close();
//        } catch (IOException e) {
//
//        }
//    }
//
//    /**
//     * 尝试获取分布式锁
//     * @param jedis Redis客户端
//     * @param lockKey 锁
//     * @return 是否获取成功
//     */
//    public static boolean tryGetDistributedLock(Jedis jedis, String lockKey) {
//
//        String result = jedis.set(lockKey, REQUEST_ID, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME,EXPIRE_TIME);
//
//        if (LOCK_SUCCESS.equals(result)) {
//            return true;
//        }
//        return false;
//
//    }
//
//    /**
//     * 释放分布式锁
//     * @param jedis Redis客户端
//     * @param lockKey 锁
//     * @param requestId 请求标识
//     * @return 是否释放成功
//     */
//    public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
//
//        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
//        Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
//
//        if (RELEASE_SUCCESS.equals(result)) {
//            return true;
//        }
//        return false;
//
//    }
//}
